package com.xiaoxu.media.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.xiaoxu.base.model.PageParams;
import com.xiaoxu.base.model.PageResult;
import com.xiaoxu.base.model.RestResponse;
import com.xiaoxu.media.model.dto.QueryMediaParamsDto;
import com.xiaoxu.media.model.dto.UploadFileParamsDto;
import com.xiaoxu.media.model.dto.UploadResultMediaDto;
import com.xiaoxu.media.model.po.MediaFiles;

import java.io.File;

/**
 * @author xiaoxu
 * @version 1.0
 * @description 媒资文件管理业务类
 * @date 2023/1/20 15:55
 */
public interface MediaFileService extends IService<MediaFiles> {

    /**
     * 查询文件分页列表
     * @param companyId  机构Id
     * @param pageParams  分页参数
     * @param queryMediaParamsDto 查询条件
     * @return PageResult<MediaFiles>
     * @description 媒资文件查询方法
     */
     PageResult<MediaFiles> queryMediaFiels(Long companyId, PageParams pageParams, QueryMediaParamsDto queryMediaParamsDto);

    /**
     * 上传文件的通用接口
     * @param companyId  机构Id
     * @param fileBytes 字节数组
     * @param params 文件参数
     * @param folder 文件目录
     * @param objectName 文件名称
     * @return UploadResultMediaDto
     */
    UploadResultMediaDto uploadFile(Long companyId, byte[] fileBytes, UploadFileParamsDto params,String folder,String objectName);

    /**
     *  将文件信息添加到数据库中
     * @param companyId 机构Id
     * @param fileId 文件唯一标识 : MD5码
     * @param params 上传文件参数
     * @param bucketName 桶名称
     * @param objectName 文件名称 : 路径 + 文件名 + 后缀
     * @return MediaFiles
     */
    MediaFiles addFileToDB(Long companyId, String fileId, UploadFileParamsDto params,String bucketName,String objectName);

    /**
     * @description 检查文件是否存在
     * @param fileMd5 文件的md5
     * @return RestResponse<Boolean> false不存在，true存在
     */
     RestResponse<Boolean> checkFile(String fileMd5);

    /**
     * @description 检查分块是否存在
     * @param fileMd5  文件的md5
     * @param chunkIndex  分块序号
     * @return RestResponse<Boolean> false不存在，true存在
     */
     RestResponse<Boolean> checkChunk(String fileMd5, int chunkIndex);

    /**
     * @description 上传分块
     * @param fileMd5  文件md5
     * @param chunk  分块序号
     * @param bytes  文件字节
     * @return RestResponse
     */
     RestResponse uploadChunk(String fileMd5,int chunk,byte[]bytes);

    /**
     * @description 合并分块
     * @param companyId  机构id
     * @param fileMd5  文件md5
     * @param chunkTotal 分块总和
     * @param uploadFileParamsDto 文件信息
     * @return RestResponse
     */
     RestResponse mergeChunks(Long companyId,String fileMd5,int chunkTotal,UploadFileParamsDto uploadFileParamsDto);

    /**
     * 根据文件MD5码删除文件
     * @param md5 文件MD5码
     */
     void deleteDBFile(String md5);

    /**
     * @description 根据id查询文件信息
     * @param id 文件Id
     * @return MediaFiles
     */
     MediaFiles getFileById(Long id);

    /**
     * 根据文件Id删除文件
     * @param id 文件Id
     */
    void deleteDBFile(Long id);

    /**
     * 从分布式文件系统下载文件
     * @param file 文件路径
     * @param bucket 桶
     * @param objectName  文件名
     */
    void downloadFileFromMinIO(File file, String bucket, String objectName);

    /**
     * 上传文件到分布式文件系统
     * @param bytes      文件字节数组
     * @param bucketName 分布式系统的桶名称
     * @param objectName 对象名称 : 路径 + 文件名 + 后缀
     */
    void uploadFileToMinio(byte[] bytes, String bucketName, String objectName);

}
